home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’93 / IconDisposer / IconDisposer.a < prev    next >
Encoding:
Text File  |  1993-06-13  |  8.6 KB  |  425 lines  |  [TEXT/MPS ]

  1.     CASE    OBJ
  2.     STRING    ASIS
  3.  
  4.             include    'SysEqu.a'
  5.             include    'QuickEqu.a'
  6.             include    'ToolEqu.a'
  7.             include    'Traps.a'
  8.             include    'GestaltEqu.a'
  9.             include    'Icons.a'
  10.             include 'FSEqu.a'
  11.             include    'Sound.a'
  12.  
  13. kHFSDispatchTrapWord    equ $60
  14. kMountVolTrapWord        equ    $F
  15. kUnmountVolTrapWord        equ    $E
  16.  
  17. kVolumeMountSelector    equ    65
  18. kGetCatInfoSelector        equ    9
  19.  
  20. kLoadedIcon                equ -4064
  21. kNotLoadedIcon            equ $81
  22. kIconDisposerIconID        equ    128
  23.  
  24. kOnMask                    equ    $0001
  25. kCDMask                    equ    $0002
  26. kNetVolMask                equ    $0004
  27. kFloppyMask                equ    $0008
  28. kLocalMask                equ    $0010
  29.  
  30. gestaltIconDisposer    equ 'byeb'
  31.  
  32.                     Macro
  33.                     PatchHeader &oldTrapAddress
  34.                         String AsIs
  35.                         dc.l    'byeb'
  36.                         String Pascal
  37.                         &oldTrapAddress: jmp    $12345678
  38.                     EndM
  39.  
  40. GlobalVariables        Record    0
  41. globalSize            equ        *
  42.                     EndR
  43.  
  44. InstallIconDisposer    Proc    Export
  45.             Import    HFSDispatchPatch, oldHFSDispatch
  46.             Import    MountVolPatch, oldMountVol
  47.             Import    UnmountVolPatch, oldUnmountVol
  48.             Import    ShowINIT
  49.             Import    IconDisposerGestalt
  50.  
  51.             tst.w    $17A
  52.             bpl.s    @noCmdKey
  53.             move.w    #kNotLoadedIcon, d1
  54.             bra.w    @showIcon
  55.  
  56. @noCmdKey    
  57.             move.l    a0,-(sp)                    ; Save handle to init
  58.             move.l    #gestaltIconDisposer, d0
  59.             _Gestalt
  60.             cmpi.w    #gestaltDupSelectorErr,d0    ; See if globals are already installed
  61.             bne.s    @continueLoad                ; Go ahead and install ourselves
  62.             addq    #4,sp                        ; Pop the handle
  63.             move.w    #kNotLoadedIcon, d1
  64.             bra.w    @showIcon
  65.             
  66. @continueLoad
  67.             _DetachResource
  68.  
  69.             move.l    TheZone,-(sp)                ; Save the current zone
  70.             move.l    SysZone,TheZone                ; Make the system zone the current zone
  71.  
  72.             move.w    #51, d0
  73.             _NewHandle ,Sys,Clear
  74.             move.l    a0, a2
  75.  
  76.             move.l    (a2), a3
  77.  
  78.             lea        IconDisposerGestalt,a1    
  79.             move.l    a2,2(a1)                    ; Save handle to globals in our gestalt routine
  80.             subq    #2,sp
  81.             move.l    #gestaltIconDisposer,d0        ; IconDisposer selector type
  82.             move.l    a1,a0                        ; A1 still has pointer to Gestalt routine
  83.             _NewGestalt
  84.             addq    #2,sp
  85.  
  86.             move.l    (sp)+, TheZone                ; Restore the current zone
  87.  
  88. @getPreferences
  89.             subq    #4, sp
  90.             move.l    #'glob', -(sp)
  91.             move.w    #1, -(sp)
  92.             _Get1Resource
  93.             move.l    (sp)+, d0
  94.             beq.s    @noPrefs
  95.             move.l    d0, a0
  96.             move.l    (a0), a0
  97.             move.b    (a0), d6
  98.             ext.w    d6
  99.             move.b    d6, d5
  100.             bra.s    @shouldPatchTraps
  101.  
  102. @noPrefs
  103.             moveq    #0, d6
  104.             moveq    #0, d5
  105.  
  106. @shouldPatchTraps
  107.             move.b    d6, (a3)
  108.             andi.w    #kOnMask, d5
  109.             bne.s    @patchTraps
  110.             move.w    #kNotLoadedIcon, d1            ; We don't want to be on.
  111.             bra.w    @showIcon                    
  112.  
  113. @patchTraps
  114.             move.w    #kHFSDispatchTrapWord,d0
  115.             _GetTrapAddress ,NewOS
  116.             lea        oldHFSDispatch, a1
  117.             move.l    a0,2(a1)
  118.             lea        HFSDispatchPatch, a0
  119.             move.w    #kHFSDispatchTrapWord,d0
  120.             _SetTrapAddress ,NewOS                ; Apply our patch to HFSDispatch
  121.  
  122.             move.w    #kMountVolTrapWord,d0
  123.             _GetTrapAddress ,NewOS
  124.             lea        oldMountVol, a1
  125.             move.l    a0,2(a1)
  126.             lea        MountVolPatch, a0
  127.             move.w    #kMountVolTrapWord,d0
  128.             _SetTrapAddress ,NewOS                ; Apply our patch to MountVol
  129.  
  130.             move.w    #kUnmountVolTrapWord,d0
  131.             _GetTrapAddress ,NewOS
  132.             lea        oldUnmountVol, a1
  133.             move.l    a0,2(a1)
  134.             lea        UnmountVolPatch, a0
  135.             move.w    #kUnmountVolTrapWord,d0
  136.             _SetTrapAddress ,NewOS                ; Apply our patch to UnmountVol
  137.  
  138. @noGlobals
  139.             move.l    $2+VCBQHdr, d1
  140.  
  141.             move.l    d1, a1
  142.             beq.s    @successfulLoad
  143.             move.w    VCB.vcbVRefNum(A1), d1
  144.             neg.w    d1
  145.             ext.l    d1
  146.             add.l    d1, a3
  147.             move.w    VCB.vcbFSID(A1), d1
  148.             move.w    d1, d1
  149.             beq.s    @check1Floppy        ; This is an HFS volume.
  150.                                         ; Check if its a floppy.
  151.  
  152.             move.b    d6, d5
  153.             andi.b    #kNetVolMask, d5
  154.             beq.s    @successfulLoad
  155.  
  156. @hideIconsOnVol
  157.             moveq    #1, d0
  158.             move.b    d0, (a3)
  159.             bra.s    @successfulLoad
  160.  
  161. @check1Floppy
  162.             move.w    VCB.vcbDrvNum(a1), d2
  163.             cmpi.w    #1, d2                ; Is this drive #1?
  164.             beq.s    @checkDo
  165.             cmpi.w    #2, d2                ; Is this drive #2?
  166.             bne.s    @checkCD
  167. @checkDo
  168.             move.b    d6, d5
  169.             andi.b    #kFloppyMask, d5
  170.             beq.s    @successfulLoad
  171.             bra.s    @hideIconsOnVol
  172.  
  173. ; Now check to see if it is a CD.
  174.  
  175. @checkCD
  176.             move.w    VCB.vcbAtrb(a1), d2
  177.             btst    #7, d2
  178.             beq.s    @checkLocalVol
  179.             move.b    d6, d5
  180.             andi.b    #kCDMask, d5
  181.             beq.s    @successfulLoad
  182.             bra.s    @hideIconsOnVol
  183.  
  184. ; Check if it is a local harddrive.
  185.  
  186. @checkLocalVol
  187.             move.b    d6, d5
  188.             andi.b    #kLocalMask, d5
  189.             beq.s    @successfulLoad
  190.             bra.s    @hideIconsOnVol
  191.             
  192. @successfulLoad
  193.             move.w    #kLoadedIcon, d1
  194.  
  195. @showIcon
  196.             move.w    d1, -(sp)
  197.             move.w    #-1, -(sp)
  198.             jsr        ShowINIT                    ; Show our init
  199.             rts
  200.  
  201.             EndProc
  202.  
  203. ;_________________________________________________________________________________________
  204. ; MountVol patch checks if a volume should have it's custom icons displayed.
  205.  
  206. MountVolPatch    Proc    Export
  207.             Export    oldMountVol
  208.             Import    CheckVolume
  209.  
  210.             bra.s    PatchStart
  211.             PatchHeader oldMountVol
  212.             
  213. PatchStart
  214.             bsr.s    oldMountVol
  215.             cmpi.w    #volOnLinErr, d0
  216.             beq.s    @handleAnyway                ; On a chooser mount, they use an AFP
  217.                                                 ; mount command.  Since I don't want to
  218.                                                 ; patch the .XPP driver, I will just 
  219.                                                 ; handle it from here, since the AFP
  220.                                                 ; mount eventually calls MountVol
  221.  
  222.             move.l    d0, d0
  223.             bne.s    @noRestoreExit                ; If there was an error, leave
  224.  
  225. @handleAnyway
  226.             bsr        CheckVolume
  227.  
  228. @noRestoreExit
  229.             rts
  230.             EndProc
  231.  
  232. ;_________________________________________________________________________________________
  233. ; UnmountVol patch clears any information stored about a volume.
  234.  
  235. UnmountVolPatch    Proc    Export
  236.             Export    oldUnmountVol
  237.  
  238.             bra.s    PatchStart
  239.             PatchHeader oldUnmountVol
  240.             
  241. PatchStart
  242.             movem.l    d0/a0/a3-a4, -(sp)
  243.  
  244.             move.l    a0, a4
  245.  
  246.             move.l    #gestaltIconDisposer, d0
  247.             _Gestalt                            ; Get our globals
  248.             move.l    (a0),a3
  249.  
  250.             move.b    (a3), d0
  251.             andi.b    #kOnMask, d0
  252.             beq.s    @done
  253.  
  254.             move.w    VolumeParam.ioVRefNum(a4), d0
  255.             neg.w    d0
  256.             ext.l    d0
  257.             add.l    d0, a3
  258.             
  259.             moveq    #0, d0
  260.             move.b    d0, (a3)
  261.  
  262. @done
  263.             movem.l    (sp)+, d0/a0/a3-a4
  264.  
  265.             bra.s    oldUnmountVol
  266.  
  267.             EndProc
  268.  
  269. ;_________________________________________________________________________________________
  270. ; HFSDispatch patch to turn custom icon bit off and check for volumemount calls.
  271.  
  272. HFSDispatchPatch    Proc    Export
  273.             Export    oldHFSDispatch
  274.             Import    CheckVolume
  275.  
  276.             bra.s    PatchStart
  277.             PatchHeader oldHFSDispatch
  278.             
  279. PatchStart
  280.             cmpi.w    #kGetCatInfoSelector, d0
  281.             bne.s    @checkVolumeMount
  282.             bsr.s    oldHFSDispatch
  283.  
  284.             movem.l    d0-d1/a0/a3-a4, -(sp)
  285.  
  286.             move.l    a0, a4
  287.  
  288.             move.l    #gestaltIconDisposer, d0
  289.             _Gestalt                            ; Get our globals
  290.             move.l    (a0),a3
  291.  
  292.             move.b    (a3), d0
  293.             andi.b    #kOnMask, d0
  294.             beq.s    @done
  295.  
  296.             move.w    CInfoPBRec.hFileInfo.ioVRefNum(a4), d0
  297.             neg.w    d0
  298.             ext.l    d0
  299.             add.l    d0, a3
  300.  
  301.             move.b    (a3), d0
  302.             beq.s    @done
  303.             
  304.             move.w    #$FBFF, d1
  305.             and.w    d1, CInfoPBRec.hFileInfo.ioFlFndrInfo.fdFlags(a4)
  306.  
  307. @done
  308.             movem.l    (sp)+, d0-d1/a0/a3-a4
  309.             rts
  310.  
  311. @checkVolumeMount
  312.             cmpi.w    #kVolumeMountSelector, d0
  313.             bne.s    oldHFSDispatch
  314.             _Debugger
  315.             bsr.s    oldHFSDispatch
  316.             
  317.             bsr        CheckVolume
  318.             
  319.             rts
  320.             EndProc
  321.  
  322. ;_________________________________________________________________________________________
  323. ; CheckVolume routine
  324.  
  325. CheckVolume    Proc    Export
  326.  
  327.             movem.l    d0-d5/a2-a4, -(sp)
  328.  
  329.             move.l    a0, a4
  330.  
  331.             move.l    #gestaltIconDisposer, d0
  332.             _Gestalt                            ; Get our globals
  333.             move.l    (a0),a3
  334.  
  335.             move.b    (a3), d4
  336.             move.b    d4, d5
  337.             andi.b    #kOnMask, d5
  338.             beq.s    @done
  339.  
  340.             tst.b    $17B
  341.             bne.s    @done                        ; If you want to see the icons,
  342.                                                 ; on a volume, hold down control
  343.  
  344.             move.w    VolumeParam.ioVRefNum(a4), d0
  345.             move.w    d0, d2
  346.             neg.w    d0
  347.             ext.l    d0
  348.             add.l    d0, a3
  349.             
  350.             move.l    $2+VCBQHdr, d1
  351. @loop
  352.             move.l    d1, a2
  353.             beq.s    @done
  354.             move.w    VCB.vcbVRefNum(A2), d1
  355.             cmp.w    d2, d1
  356.             bne.s    @nextItem
  357.             move.w    VCB.vcbFSID(A2), d1
  358.             move.w    d1, d1
  359.             beq.s    @check1Floppy        ; This is an HFS volume.
  360.                                         ; Check if its a floppy.
  361.  
  362.             move.b    d4, d5
  363.             andi.b    #kNetVolMask, d5
  364.             beq.s    @done
  365.  
  366. @hideIconsOnVol
  367.             moveq    #1, d0
  368.             move.b    d0, (a3)
  369.             bra.s    @done
  370.  
  371. @check1Floppy
  372.             move.w    VCB.vcbDrvNum(a2), d2
  373.             cmpi.w    #1, d2                ; Is this drive #1?
  374.             beq.s    @checkDo
  375.             cmpi.w    #2, d2                ; Is this drive #2?
  376.             bne.s    @checkCD
  377. @checkDo
  378.             move.b    d4, d5
  379.             andi.b    #kFloppyMask, d5
  380.             beq.s    @done
  381.             bra.s    @hideIconsOnVol
  382.  
  383. ; Now check to see if it is a CD.
  384.  
  385. @checkCD
  386.             move.w    VCB.vcbAtrb(a2), d2
  387.             btst    #7, d2
  388.             beq.s    @checkLocalVol
  389.             move.b    d4, d5
  390.             andi.b    #kCDMask, d5
  391.             beq.s    @done
  392.             bra.s    @hideIconsOnVol
  393.  
  394. @checkLocalVol
  395.             move.b    d4, d5
  396.             andi.b    #kLocalMask, d5
  397.             beq.s    @done
  398.             bra.s    @hideIconsOnVol
  399.             
  400. @nextItem
  401.             move.l    VCB.qLink(A2), d1
  402.             bra.s    @loop
  403.  
  404. @done
  405.             movem.l    (sp)+, d0-d5/a2-a4
  406.             rts
  407.             EndProc
  408.  
  409. ;_________________________________________________________________________________________
  410. ; Gestalt routine
  411.  
  412. IconDisposerGestalt    Proc    Export
  413.             bra.s    GestaltStart
  414. globalHandle
  415.             ds.l    1                            ; Handle to IconDisposer globals stored here
  416. GestaltStart
  417.             move.l    (sp)+,a0                    ; Get return address
  418.             move.l    (sp)+,a1                    ; Get address to stash global handle
  419.             move.l    globalHandle,(a1)
  420.             addq    #4,sp                        ; Pop selector
  421.             clr.w    (sp)                        ; Return noErr
  422.             jmp        (a0)
  423.             EndProc
  424.  
  425.             End